﻿using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Kaskelot.SP.Core
{
	public static class StringExtensions
	{
		public static bool IsValidPostNr(this string postnr)
		{
			return Regex.IsMatch(postnr, @"^[0-9]{3}[ ][0-9]{2}$");
		}

		public static bool IsValidEpost(this string epost)
		{
			return Regex.IsMatch(epost, @"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$");
		}

		public static bool IsValidPersNr(this string persnr)
		{
			// Testa att formatet är rätt
			if(!Regex.IsMatch(persnr, @"^(19|20)[0-9]{6}[-+][0-9]{4}$"))
				return false;

			// Testa att det inte är nonsens som t ex månad 15
			var month = Int32.Parse(persnr.Substring(4, 2));
			if (month < 1 || month > 12)
				return false;

			var day = Int32.Parse(persnr.Substring(6, 2));
			if (day < 1 ||
				day > 31 ||
				(month == 2 && day > 29) ||
				(month == 4 && day > 30) ||
				(month == 6 && day > 30) ||
				(month == 9 && day > 30) ||
				(month == 11 && day > 30))
				return false;

			// Testa att det har en korrekt kontrollsiffra
			var siffror = persnr.Substring(2, 6) + persnr.Substring(9, 3);

			var summa = 0;
			for (var i = 0; i < 9; i++) {
				var num = Int32.Parse(siffror.Substring(i, 1));

				var ny = 0;
				if (i % 2 == 0) {
					ny = num * 2;
				} else {
					ny = num;
				}

				if (ny > 9) {
					summa += 1;
					summa += (ny - 10);
				} else {
					summa += ny;
				}
			}

			while (summa > 10) {
				summa -= 10;
			}

			var entalssiffra = summa;
			var kontrollsiffra = 10 - entalssiffra;

			if(Int32.Parse(persnr.Substring(12)) != kontrollsiffra)
				return false;

			return true;
		}

		public static bool IsNullOrEmpty(this string s)
		{
			return String.IsNullOrEmpty(s);
		}

		public static bool IsNonEmpty(this string s)
		{
			return !String.IsNullOrEmpty(s);
		}

		public static string ToSharePointFullName(this string loginName)
		{
			SPUser user = null;
			try
			{
				user = SPContext.Current.Web.AllUsers[loginName];
				if (user != null)
				{
					return user.Name;
				}
			}
			catch
			{
			}

			return loginName;
		}
	}
}
